今天份的學習,主要討論在寫程式時應不應該替函式命名,看完 Kyle 的觀點,認同他說的:每個函式都應該命名。
為什麼?
如果不能夠替函式命名,可能代表不清楚這個函式在做什麼,或是這個函式做太多事情了,或是...缺乏想像力;
沒有命名的函式,必須要看內容才能知道在做什麼,甚至還要在腦中跑一下這些程式碼;
命名的函式,從名字就知道在做什麼,讓其他開法者在看 codes 時,可以更快、更順暢(提高易讀性)。
內容參考:Scope & Closure apA
先看一下,匿名函式會造成在 debug 上增加難度
btn.addEventListener('click',function(){
setTimeout(function(){
["temp",100].map(function(v){
console.log(v.toUpperCase());
});
}, 100);
});
// Uncaught TypeError: v.toUpperCase is not a function
// at myProgram.js:4
// at Array.map (<anonymous>)
// at myProgram.js:3
上面的 snippet 所有 callbacks 都是匿名函式,當有 error 時,只丟出第幾行有問題,不知道是哪個函式發生錯誤。
具名的「名」有分成:explicit 和 inferred
function thisIsNamed() {
// ..
};
這個是 explicit name thisIsNamed
ajax("action.url", function thisIsAlsoNamed(){
// ..
});
這個是 explicit name thisIsAlsoNamed
var notNamed = function(){
// ..
};
// nah... notNamed, really?
console.log(notNamed.name); // notNamed
這個是 inferred name notNamed
var config = {
cb /*also not a name*/: function(){
// ..
};
};
console.log(config.cb.name); // cb
這個是 inferred name cb
function ajax(url, cb) {
console.log(cb.name);
}
ajax("action.url", function(){
// ..
});
// ""
Line 5 的匿名函式當作 callback 傳進第二個參數,結果 name 屬性回傳 ""
通常 function expressions 會作為 callback 傳進參數裡,如果這個 callback 是匿名的,那它連 inferred name 也不會有。
所有的 arrow function 都是匿名的,可能有 inferred name,但理論上都算匿名。
原文有聊到更多,連結在下面。